#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+7;
int a[N],cnt[N],tree[N],n,ans;
void pushup(int k){
    tree[k]=tree[k*2]+tree[k*2+1];
}
void build(int k,int l,int r){
    if(l==r){
        tree[k]=cnt[l];
        return;
    }
    int mid=l+r>>1;
    build(k*2,l,mid),build(k*2+1,mid+1,r),pushup(k);
}
void update(int k,int l,int r,int x,int y){
    if(l>x||r<x) return;
    if(l==x&&r==x){
        tree[k]+=y;
        return;
    }
    int mid=l+r>>1;
    update(k*2,l,mid,x,y),update(k*2+1,mid+1,r,x,y),pushup(k);
}
int query(int k,int l,int r,int x){
    if(l>r) return -1;
    if(l==r) return ((tree[k]&&l<=x)?l:-1);
    int mid=l+r>>1;
    if(mid<=x){
        if(tree[k*2]) return query(k*2,l,mid,x);
        return query(k*2+1,mid+1,r,x);
    }
    return query(k*2,l,mid,x);
}
void Files(){
    freopen("duel.in","r",stdin);
    freopen("duel.out","w",stdout);
}
signed main(){
    Files();
    scanf("%lld",&n),ans=n;
    for(int i=1;i<=n;i++) scanf("%lld",&a[i]),cnt[a[i]]++;
    sort(a+1,a+1+n),build(1,1,1e5);
    for(int i=1;i<=n;i++){
        if(a[i]==1) continue;
        int pos=query(1,1,1e5,a[i]-1);
        if(pos!=-1) ans--,update(1,1,1e5,pos,-1);
    }
    printf("%lld\n",ans);
    return 0;
}
